ifneq ($(KERNELRELEASE),)
obj-m   := hid-timelink.o
else
PACKAGE ?= timelink-touchwin
VERSION ?= $(shell git describe | sed -n -r 's/v([0-9]+(\.[0-9]+){0,3})(\-[0-9]+)?(\-[0-9a-z]+)?/\1\3/p' | tr - +)

################################################################################
# Configurations
################################################################################
# Our device would be bound to hid-multitouch since v3.5, but sometimes that is
# not really what we want, therefore, install udev rule to avoid that.
INSTALL_WITH_UDEVRULES ?= 1
INSTALL_WITH_DEPMOD ?= 1
INSTALL_DKMS_WITH_SETUP ?= 1

################################################################################
# Standalone building rule
################################################################################
KVER    ?= $(shell uname -r)
KDIR    := /lib/modules/$(KVER)/build
MDIR    := $(DESTDIR)/lib/modules/$(KVER)/extra
RDIR    := $(DESTDIR)/etc/udev/rules.d
PWD     := $(shell pwd)

all:
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

install:
ifeq ($(DESTDIR),)
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules_install
else
	@if [ ! -d $(MDIR) ]; then mkdir -p $(MDIR); fi
	install -m 644 hid-timelink.ko $(MDIR)/hid-timelink.ko
endif

ifneq ($(INSTALL_WITH_UDEVRULES),0)
install: install-udevrules
endif 
ifneq ($(INSTALL_WITH_DEPMOD),0)
install: install-depmod
endif

install-depmod:
	depmod -a

install-udevrules:
	@if [ ! -d $(RDIR) ]; then mkdir -p $(RDIR); fi
	install -m 644 hid-timelink.rules $(RDIR)/42-hid-timelink.rules
	install -m 755 load_hid_timelink.sh $(RDIR)/../load_hid_timelink.sh

#%:
	#$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) $@

clean:
	-rm -f *~
	-rm -f *.o *.ko *.mod.c
	-rm -f Module.symvers Module.markers modules.order

dist: $(PACKAGE)-$(VERSION).tar.bz2

%-$(VERSION).tar.bz2: hid-timelink.c hid-timelink.rules load_hid_timelink.sh Makefile
	@if [ -d $(basename $(basename $@)) ]; then rm -rf $(basename $(basename $@)); fi
	mkdir $(basename $(basename $@))
	cp hid-timelink.c hid-timelink.rules load_hid_timelink.sh Makefile $(basename $(basename $@))
	tar jcf $@ $(basename $(basename $@))
	rm -rf $(basename $(basename $@))

################################################################################
# DKMS rule
################################################################################
install-src: dkms-$(PACKAGE)-$(VERSION).tar.bz2
	@if [ ! -d $(DESTDIR)/usr/src/ ]; then mkdir -p $(DESTDIR)/usr/src/; fi
	tar jxf $< -C $(DESTDIR)/usr/src/
	@if [ -d $(DESTDIR)/usr/src/$(PACKAGE)-$(VERSION) ]; then rm -rf $(DESTDIR)/usr/src/$(PACKAGE)-$(VERSION); fi
	mv $(DESTDIR)/usr/src/$(basename $(basename $^)) $(DESTDIR)/usr/src/$(PACKAGE)-$(VERSION)

uninstall-src:
	-rm -rf $(DESTDIR)/usr/src/$(PACKAGE)-$(VERSION)

install-dkms: install-src install-dkms-conf

ifneq ($(INSTALL_DKMS_WITH_SETUP),0)
install-dkms: install-dkms-setup
endif
ifneq ($(INSTALL_WITH_UDEVRULES),0)
install-dkms: install-udevrules
endif 

install-dkms-conf:
	cd $(DESTDIR)/usr/src/$(PACKAGE)-$(VERSION); make dkms.conf

install-dkms-setup:
	dkms add -m $(PACKAGE) -v $(VERSION)
	dkms build -m $(PACKAGE) -v $(VERSION)
	dkms install -m $(PACKAGE) -v $(VERSION)

uninstall-dkms: uninstall-dkms-teardown uninstall-src

uninstall-dkms-teardown:
	-dkms uninstall -m $(PACKAGE) -v $(VERSION)
	-dkms remove -m $(PACKAGE) -v $(VERSION) --all

dkms.conf:
	@echo generating dkms.conf ...
	@echo 'PACKAGE_NAME=$(PACKAGE)' > $@
	@echo 'PACKAGE_VERSION=$(VERSION)' >> $@
	@echo 'CLEAN="make clean"' >> $@
	@echo 'MAKE[0]="echo ;make all KVER=$$kernelver"' >> $@
	@echo 'BUILT_MODULE_NAME[0]="hid-timelink"' >> $@
	@echo 'DEST_MODULE_LOCATION[0]="/extra"' >> $@
	@echo 'AUTOINSTALL="yes"' >> $@
	@echo '' >> $@
	
################################################################################
# Debian packaging rule
################################################################################
deb-prepare: 
	@if [ -d debian ]; then rm -rf debian; fi
	dh_make -k -n -p $(PACKAGE)_$(VERSION)
	patch -p0 -i debian.patch

deb: deb-prepare
	dpkg-buildpackage -b -us -uc -r

################################################################################
# RPM packaging rule
################################################################################
rpm-prepare: dist
	@if [ ! -d ~/rpmbuild/SOURCES/ ]; then mkdir -p ~/rpmbuild/SOURCES/; fi
	@if [ ! -d ~/rpmbuild/SPECS/ ]; then mkdir -p ~/rpmbuild/SPECS/; fi
	cp $(PACKAGE)-$(VERSION).tar.bz2 ~/rpmbuild/SOURCES/
	sed -i -e 's/^Version:.*/Version: $(VERSION)/g' $(PACKAGE).spec
	cp $(PACKAGE).spec ~/rpmbuild/SPECS

rpm: rpm-prepare
	oldpwd=`pwd`; \
	PATH=$$PATH:`pwd`; \
	cd ~/rpmbuild/SPECS; \
	rpmbuild -bb --target=`uname -m` --define 'kavriants ""' $(PACKAGE).spec \
	| tee /dev/tty | grep "^Wrote" | cut -d' ' -f 2 | xargs -i cp {} $$oldpwd

rpm-prepare-dkms: dkms-$(PACKAGE)-$(VERSION).tar.bz2
	@if [ ! -d ~/rpmbuild/SOURCES/ ]; then mkdir -p ~/rpmbuild/SOURCES/; fi
	@if [ ! -d ~/rpmbuild/SPECS/ ]; then mkdir -p ~/rpmbuild/SPECS/; fi
	cp $< ~/rpmbuild/SOURCES/
	@sed -i -e 's/^Version:.*/Version: $(VERSION)/g' dkms-$(PACKAGE).spec
	cp dkms-$(PACKAGE).spec ~/rpmbuild/SPECS/

rpm-dkms: rpm-prepare-dkms
	oldpwd=`pwd`; \
	pushd ~/rpmbuild/SPECS; \
	rpmbuild -bb dkms-$(PACKAGE).spec | tee /dev/tty | grep "^Wrote" | cut -d' ' -f 2 | xargs -i cp {} $$oldpwd

################################################################################
# EBuild packaging rule
################################################################################
ebuild-prepare: dist
	@if [ ! -d /usr/local/portage/sys-kernel/$(PACKAGE) ]; \
		then mkdir -p /usr/local/portage/sys-kernel/$(PACKAGE); \
	fi
	cp $(PACKAGE)-$(VERSION).tar.bz2 /usr/portage/distfiles/
	cp $(PACKAGE).ebuild /usr/local/portage/sys-kernel/$(PACKAGE)/$(PACKAGE)-$(VERSION).ebuild
	pushd /usr/local/portage/sys-kernel/$(PACKAGE); \
	ebuild $(PACKAGE)-$(VERSION).ebuild manifest --force

ebuild: ebuild-prepare
	pushd /usr/local/portage/sys-kernel/$(PACKAGE); \
	ebuild $(PACKAGE)-$(VERSION).ebuild unpack compile install package
	cp /usr/portage/packages/sys-kernel/$(PACKAGE)-$(VERSION).tbz2 .

.PHONY: clean install deb-prepare rpm-prepare-dkms dkms.conf
endif
